package ucla.encuestaMatic.controlador.servicios;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Order;

import com.obelisco.modelo.data.DataGenerica;

import ucla.encuestaMatic.controlador.interfaces.IServicioAdministracionReporteResumenEncuesta;
import ucla.encuestaMatic.modelo.beans.OpcionPreguntaResumenEncuesta;
import ucla.encuestaMatic.modelo.beans.PreguntaResumenEncuesta;
import ucla.encuestaMatic.modelo.dao.ServicioEncuestaDAO;
import ucla.encuestaMatic.modelo.dao.ServicioEncuestaPreguntaPersonaDAO;
import ucla.encuestaMatic.modelo.dao.ServicioOpcionPreguntaDAO;
import ucla.encuestaMatic.modelo.dao.ServicioPreguntaDAO;
import ucla.encuestaMatic.modelo.data.Encuesta;
import ucla.encuestaMatic.modelo.data.OpcionPregunta;
import ucla.encuestaMatic.modelo.data.Pregunta;

public class ServicioAdministracionReporteResumenEncuesta implements IServicioAdministracionReporteResumenEncuesta {

	private ServicioEncuestaDAO servicioEncuestaDAO;
	private ServicioPreguntaDAO servicioPreguntaDAO;
	private ServicioEncuestaPreguntaPersonaDAO servicioEncuestaPreguntaPersonaDAO;
	private ServicioOpcionPreguntaDAO servicioOpcionPreguntaDAO;

	public List<Encuesta> buscarEncuestas() {
		List<Order> orden = new ArrayList<Order>();
		orden.add(Order.asc("nombre"));
		List<Encuesta> lista = this.servicioEncuestaDAO.buscarTodos(DataGenerica.DATA_ACTIVO, orden);
		/*
		for (Encuesta encuesta : lista) {
			for (Iterator iter= encuesta.getPreguntas().iterator(); iter.hasNext(); ){
				Pregunta pregunta = (Pregunta)iter.next();
				pregunta.getOpcionPreguntas().size();
			}			
		}
		*/
		return lista;
	}
	/*
	private List<OpcionPregunta> buscarOpcionesPreguntaPorPregunta(Pregunta pregunta) {
		Session session = this.servicioOpcionPreguntaDAO.getSessionFactory().getCurrentSession();
		String sentencia = "SELECT opcionPregunta "+
						   "FROM OpcionPregunta opcionPregunta "+
						   "WHERE opcionPregunta.estado = :estado "+
						   "AND opcionPregunta.pregunta = :pregunta "+
						   "ORDER BY opcionPregunta.idOpcionPregunta";
		Query query = session.createQuery(sentencia);
		query.setString("estado", DataGenerica.DATA_ACTIVO);
		query.setEntity("pregunta", pregunta);
		return query.list();
	}
	*/
	private List<Pregunta> buscarPreguntasPorEncuesta(Encuesta encuesta) {
		List<Order> orden = new ArrayList<Order>();
		orden.add(Order.asc("numero"));
		return this.servicioPreguntaDAO.buscarPorPropiedad("encuesta", encuesta, DataGenerica.DATA_ACTIVO, orden);
	}
	
	private int buscarCantidadRespuestasPorOpcionPregunta(OpcionPregunta opcionPregunta) {
		Session session = this.servicioEncuestaPreguntaPersonaDAO.getSessionFactory().getCurrentSession();
		String sentencia = "SELECT COUNT(encuestaPreguntaPersona.idEncuestaPreguntaPersona) "+
						   "FROM EncuestaPreguntaPersona encuestaPreguntaPersona " +
						   "WHERE encuestaPreguntaPersona.estado = :estado " +
						   "AND encuestaPreguntaPersona.opcionPregunta = :opcionPregunta ";
		Query qry = session.createQuery(sentencia);
		qry.setString("estado", DataGenerica.DATA_ACTIVO);
		qry.setEntity("opcionPregunta", opcionPregunta);
		List lista = qry.list();
		return (lista != null && lista.size() > 0) ? ((Long)lista.get(0)).intValue() : 0;
	}
	
//	private List<OpcionPreguntaResumenEncuesta> buscarOpcionesPreguntaResumenEncuestaPorPregunta(Pregunta pregunta) {
//		List<OpcionPreguntaResumenEncuesta> opcionesPreguntaResumenEncuesta = new ArrayList<OpcionPreguntaResumenEncuesta>();
//		List<OpcionPregunta> opcionesPregunta = new ArrayList<OpcionPregunta>(pregunta.getOpcionPreguntas());
//		for (OpcionPregunta opcionPregunta : opcionesPregunta) {
//			int cantidadRespuestas = this.buscarCantidadRespuestasPorOpcionPregunta(opcionPregunta);
//			OpcionPreguntaResumenEncuesta opcionPreguntaResumenEncuesta = new OpcionPreguntaResumenEncuesta(opcionPregunta, cantidadRespuestas);
//			opcionesPreguntaResumenEncuesta.add(opcionPreguntaResumenEncuesta);
//		}
//		return opcionesPreguntaResumenEncuesta;
//	}
	
	public List<OpcionPreguntaResumenEncuesta> buscarResumenEncuesta(Encuesta encuesta) {
		List<OpcionPreguntaResumenEncuesta> opcionesPreguntaResumenEncuesta = new ArrayList<OpcionPreguntaResumenEncuesta>();
		List<Pregunta> preguntas = this.buscarPreguntasPorEncuesta(encuesta);
		for (Pregunta pregunta : preguntas) {
			List<OpcionPregunta> opcionesPregunta = new ArrayList<OpcionPregunta>(pregunta.getOpcionPreguntas());
			for (OpcionPregunta opcionPregunta : opcionesPregunta) {
				int cantidadRespuestas = this.buscarCantidadRespuestasPorOpcionPregunta(opcionPregunta);
				OpcionPreguntaResumenEncuesta opcionPreguntaResumenEncuesta = new OpcionPreguntaResumenEncuesta(opcionPregunta, cantidadRespuestas);
				opcionesPreguntaResumenEncuesta.add(opcionPreguntaResumenEncuesta);
			}
			
			
//			List<OpcionPreguntaResumenEncuesta> opcionesPreguntaResumenEncuesta = this.buscarOpcionesPreguntaResumenEncuestaPorPregunta(pregunta);
//			PreguntaResumenEncuesta preguntaResumenEncuesta = new PreguntaResumenEncuesta(pregunta);
//			preguntaResumenEncuesta.setOpcionesPreguntaResumenEncuesta(opcionesPreguntaResumenEncuesta);
//			preguntasResumenEncuesta.add(preguntaResumenEncuesta);
		}
		return opcionesPreguntaResumenEncuesta;
//		return preguntasResumenEncuesta;
		/*
		Session session = this.servicioEncuestaPreguntaPersonaDAO.getSessionFactory().getCurrentSession();
		String sentencia = "SELECT COUNT(encuestaPreguntaPersona.idEncuestaPreguntaPersona) "+
						   "FROM EncuestaPreguntaPersona encuestaPreguntaPersona " +
						   "WHERE encuestaPreguntaPersona.estado = :estado " +
						   "AND encuestaPreguntaPersona.encuesta = :encuesta "+
						   "GROUP BY encuestaPreguntaPersona.opcionPregunta";
		Query qry = session.createQuery(sentencia);
		qry.setString("estado", DataGenerica.DATA_ACTIVO);
		qry.setEntity("encuesta", encuesta);
		*/
		/*
		String sentencia = "SELECT encuestaPreguntaPersona.opcionPregunta, COUNT(encuestaPreguntaPersona.idEncuestaPreguntaPersona) "+
						   "FROM EncuestaPreguntaPersona encuestaPreguntaPersona " +
						   "WHERE encuestaPreguntaPersona.estado = :estado " +
						   "AND encuestaPreguntaPersona.opcionPregunta IN (:opcionesPregunta) "+
						   "GROUP BY encuestaPreguntaPersona.opcionPregunta";
		Query qry = session.createQuery(sentencia);
		qry.setString("estado", DataGenerica.DATA_ACTIVO);
		List<OpcionPregunta> opcionesPregunta = this.buscarOpcionesPreguntaPorEncuesta(encuesta);
		qry.setParameterList("opcionesPregunta", opcionesPregunta);
		
		List lista = qry.list();		
		return lista;
		*/
	}
	
	
	// Getter y Setter
	public ServicioEncuestaDAO getServicioEncuestaDAO() {
		return servicioEncuestaDAO;
	}

	public void setServicioEncuestaDAO(ServicioEncuestaDAO servicioEncuestaDAO) {
		this.servicioEncuestaDAO = servicioEncuestaDAO;
	}

	public ServicioEncuestaPreguntaPersonaDAO getServicioEncuestaPreguntaPersonaDAO() {
		return servicioEncuestaPreguntaPersonaDAO;
	}

	public void setServicioEncuestaPreguntaPersonaDAO(
			ServicioEncuestaPreguntaPersonaDAO servicioEncuestaPreguntaPersonaDAO) {
		this.servicioEncuestaPreguntaPersonaDAO = servicioEncuestaPreguntaPersonaDAO;
	}

	public ServicioOpcionPreguntaDAO getServicioOpcionPreguntaDAO() {
		return servicioOpcionPreguntaDAO;
	}

	public void setServicioOpcionPreguntaDAO(ServicioOpcionPreguntaDAO servicioOpcionPreguntaDAO) {
		this.servicioOpcionPreguntaDAO = servicioOpcionPreguntaDAO;
	}

	public ServicioPreguntaDAO getServicioPreguntaDAO() {
		return servicioPreguntaDAO;
	}

	public void setServicioPreguntaDAO(ServicioPreguntaDAO servicioPreguntaDAO) {
		this.servicioPreguntaDAO = servicioPreguntaDAO;
	}
	
	
}
